//
//  XGRecommendCategoryViewController.m
//  BSBuDeJie
//
//  Created by monkey on 2019/1/4.
//  Copyright © 2019 itcast. All rights reserved.
//
#import <Masonry/Masonry.h>
#import <MJRefresh/MJRefresh.h>

#import "XGRecommendCategoryViewController.h"

#import "XGDataManager.h"

#import "XGCategoryModel.h"
#import "XGCategoryRecommendTagModel.h"

#import "XGCategoryTableViewCell.h"
#import "XGCategoryRecommendTagTableViewCell.h"

/// 分类cell重用标识符
static NSString *const kCategoryTableViewCellReuseIdentifier = @"XGCategoryTableViewCell";
/// 推荐标签重用标识符
static NSString *const kCategoryRecommendTagTableViewCellReuseIdentifier = @"XGCategoryRecommendTagTableViewCell";

@interface XGRecommendCategoryViewController () <UITableViewDataSource,UITableViewDelegate>

/// 分类滚动视图
@property (nonatomic,strong) UITableView *categoryTableView;
/// 分类标签滚动视图
@property (nonatomic,strong) UITableView *recommendTagTableView;

/// 推荐关注分类数据
@property (nonatomic,strong) NSArray<XGCategoryModel *> *categoryArray;
/// 选中的分类索引
@property (nonatomic,assign) NSUInteger selectedCategoryIndex;

@end

@implementation XGRecommendCategoryViewController

#pragma mark - 控制器生命周期方法

- (void)loadView
{
    [super loadView];
    
    // 设置视图层次结构
    [self setUpUI];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 初始化操作
    [self initializeSetting];
    // 加载推荐关注分类数据
    [self loadCategoryData];
}

#pragma mark - 内部其他私有方法

// 设置界面
- (void)setUpUI
{
    // 添加子控件
    [self.view addSubview:self.categoryTableView];
    [self.view addSubview:self.recommendTagTableView];
    
    // 设置自动布局
    [self.categoryTableView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.view);
        make.centerY.equalTo(self.view);
        make.width.mas_equalTo(80);
        make.height.mas_equalTo(100);
    }];
    
    [self.recommendTagTableView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.right.bottom.equalTo(self.view);
        make.left.equalTo(self.categoryTableView.mas_right).offset(kMargin);
    }];
}

/** 初始化操作 */
- (void)initializeSetting
{
    self.navigationItem.title = @"推荐关注";
    self.view.backgroundColor = [UIColor purpleColor];
    
    // 设置分类tableView
    [self setUpCategoryTableView];
    // 设置推荐标签tableView
    [self setUpRecommendTagTableView];
}

- (void)setUpCategoryTableView
{
    // 设置分类tableView代理
    self.categoryTableView.dataSource = self;
    self.categoryTableView.delegate = self;
    
    // 设置分类tableView行高
    self.categoryTableView.rowHeight = 44.f;
    
    // 注册推荐分类cell
    [self.categoryTableView registerClass:[XGCategoryTableViewCell class] forCellReuseIdentifier:kCategoryTableViewCellReuseIdentifier];
}

- (void)setUpRecommendTagTableView
{
    // 设置推荐标签tableView代理
    self.recommendTagTableView.dataSource = self;
    self.recommendTagTableView.delegate = self;
    
    // 设置推荐标签tableView行高
    self.recommendTagTableView.rowHeight = 70.f;
    
    // 设置推荐标签tableView下拉刷新
    self.recommendTagTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewRecommendTagData)];
    
    // 设置推荐标签tableView上拉刷新
    self.recommendTagTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreRecommendTagData)];
    
    // 注册标签cell
    [self.recommendTagTableView registerClass:[XGCategoryRecommendTagTableViewCell class] forCellReuseIdentifier:kCategoryRecommendTagTableViewCellReuseIdentifier];
}

// 加载推荐关注分类数据
- (void)loadCategoryData
{
    [XGDataManager loadCategoryList:^(NSArray<XGCategoryModel *> * _Nullable dataArray, NSError * _Nullable error) {
        if (error) {
            DEBUG_Log(@"加载推荐关注分类数据失败");
            return;
        }
        
        // 重新设置分类tableView高度
        [self.categoryTableView mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.mas_equalTo(dataArray.count * 44.f);
        }];
        
        // 刷新数据
        self.categoryArray = dataArray;
        [self.categoryTableView reloadData];
        // 默认选中第一个分类
        [self.categoryTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];
        // 加载推荐标签
        [self.recommendTagTableView.mj_header beginRefreshing];
    }];
}

/**
 加载推荐关注分类下的标签

 @param categoryModel 分类
 */
- (void)loadRecommendTagDataWithCategory:(XGCategoryModel *)categoryModel
{
    [XGDataManager loadCategoryTagListWithID:categoryModel.ID page:++categoryModel.currentPage completion:^(NSArray<XGCategoryRecommendTagModel *> * _Nullable dataArray, NSInteger total, NSError * _Nullable error) {
        // 停止下拉刷新
        if ([self.recommendTagTableView.mj_header isRefreshing]) {
            [self.recommendTagTableView.mj_header endRefreshing];
        }
        
        if (error) {
            [self.recommendTagTableView.mj_footer endRefreshing];
            DEBUG_Log(@"加载推荐关注分类标签数据失败");
            return;
        }
        
        categoryModel.total = total; // 记录标签总数
        [categoryModel.recommendTagArrayM addObjectsFromArray:dataArray];
        [self.recommendTagTableView reloadData];
        // 检查上拉刷新控件状态
        [self checkFooterStatus];
    }];
}

// 加载最新推荐标签
- (void)loadNewRecommendTagData
{
    if ([self.recommendTagTableView.mj_footer isRefreshing]) {
        return;
    }
    
     XGCategoryModel *categoryModel = self.categoryArray[_selectedCategoryIndex];
    categoryModel.currentPage = 0;
    [categoryModel.recommendTagArrayM removeAllObjects];
    [self loadRecommendTagDataWithCategory:categoryModel];
}

/// 加载更多推荐标签
- (void)loadMoreRecommendTagData
{
    if ([self.recommendTagTableView.mj_header isRefreshing]) {
        return;
    }
    
    XGCategoryModel *categoryModel = self.categoryArray[_selectedCategoryIndex];
    [self loadRecommendTagDataWithCategory:categoryModel];
}

// 检查上拉刷新状态
- (void)checkFooterStatus
{
    // 没有数据时隐藏上拉刷新
    self.recommendTagTableView.mj_footer.hidden = self.categoryArray[_selectedCategoryIndex].recommendTagArrayM.count == 0;

    // 如果标签个数已经满了 提示没有数据
    if (self.categoryArray[_selectedCategoryIndex].total == self.categoryArray[_selectedCategoryIndex].recommendTagArrayM.count) {
        if ([self.recommendTagTableView.mj_footer isRefreshing]) {
            [self.recommendTagTableView.mj_footer endRefreshingWithNoMoreData];
        }
    } else {
        if ([self.recommendTagTableView.mj_footer isRefreshing]) {
            [self.recommendTagTableView.mj_footer endRefreshing];
        }
    }
}

#pragma mark - UITableViewDataSoure

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.categoryTableView) {
        return self.categoryArray.count;
    } else {
        [self checkFooterStatus];
        return self.categoryArray[_selectedCategoryIndex].recommendTagArrayM.count;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.categoryTableView) {
        XGCategoryTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCategoryTableViewCellReuseIdentifier];
        cell.categoryModel = self.categoryArray[indexPath.row];
        return cell;
    } else {
        XGCategoryRecommendTagTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCategoryRecommendTagTableViewCellReuseIdentifier];
        cell.categoryRecommendTagModel = self.categoryArray[_selectedCategoryIndex].recommendTagArrayM[indexPath.row];
        return cell;
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.categoryTableView) {
        _selectedCategoryIndex = indexPath.row;
        XGCategoryModel *categoryModel = self.categoryArray[_selectedCategoryIndex];
        if (categoryModel.recommendTagArrayM.count > 0) {
            // 如果该分类已经有推荐标签数据 直接刷新
            [self.recommendTagTableView reloadData];
        } else {
            // 如果该分类没有推荐标签数据 进行请求加载
            [self.recommendTagTableView reloadData];
            // 如果快速滚动第二个tableView 然后立马选中第一个tableView的某一行 这时会产生数组越界。例如搞笑原创有30个标签,当我们滚动第二个tableView的时候，又选中了动漫原创,动漫原创的标签个数是5,但是第二个tableView的数据还没有进行更新,所以可以滚动的列数30个,当滚动超过5就提示了数组越界.
            [self.recommendTagTableView.mj_header beginRefreshing];
        }
    }
}

#pragma mark - 懒加载

- (UITableView *)categoryTableView
{
    if (_categoryTableView == nil) {
        _categoryTableView = [[UITableView alloc] init];
    }
    
    return _categoryTableView;
}

- (UITableView *)recommendTagTableView
{
    if (_recommendTagTableView == nil) {
        _recommendTagTableView = [[UITableView alloc] init];
    }
    
    return _recommendTagTableView;
}

@end
